package supermarket1;

//TODO extends,override,super

//TODO ！！继承！！！！extends
// 子类自然继承父类的方法和属性
// 使用子类的引用可调用父类的Public方法和属性
// 子类不能使用父类的private属性和方法
// 一个类只能继承唯一一个父类，但一个类可被多个子类继承

//TODO 手机也属于商品，所以商品有的属性手机都有
// 因此，手机继承商品的属性和某些方法
public class Phone extends Merchandise{
    //给Phone额外于父类的新属性
    private double screenSize;
    private double cpuHZ;
    private int memoryG;
    private int storageG;
    private String brand;
    private String os;

    //TODO 构造函数中，给的参数必须包含父类的参数也包含子类的参数，这样才完善
    public Phone(String name,String id,int count,double soldPrice,double purchasePrice,double screenSize,double cpuHZ,int memoryG,int storageG,String brand,String os){

        //TODO super()即为调用父类的构造方法给属性赋值，
        // 必须为子类构造方法的第一个语句
        // 也可以调用set方法逐一给各个父类属性赋值，太麻烦
        super(name,id,count,soldPrice,purchasePrice);
        //TODO 给当前类属性中从父类继承过来的id属性赋值,
        //  id是父类的private属性,也就是Phone的private属性

        this.setId(id);
        //TODO 给自己的特殊属性赋值
        this.screenSize=screenSize;
        this.cpuHZ=cpuHZ;
        this.memoryG=memoryG;
        this.storageG=storageG;
        this.brand=brand;
        this.os=os;
    }
    //TODO super访问父类继承来的成员变量，
    // 父类中name属性为public，因此在该子类中可以直接访问name
    // 如果父类中属性为private，则访问要通过get方法
    public String getName(){
        //TODO 用父类的public属性，可直接使用名字
        return (this.brand+":"+this.os+":"+name);
        //TODO 若父类name是private,则无法直接访问，
        // 且访问getName又与当前方法重名会引起死循环
        // 借助!!!!super!!!
        // 将super认为是子类中特殊的父类对象
        // 调用父类的getName()方法如下
        // return (this.brand+":"+this.os+":"+super.getName());
    }
    private static int MAX_BUY=5;
    //TODO !!覆盖(override)，子类可以继承父类的方法
    // 但若子类对父类的方法要有所修改,可以重新定义==多态：不同子类继承相同的方法给不同的定义覆盖父类
    // 但必须方法签名及返回值类型都与父类的！！完全一样！！
    public double buy(int count){
        if(count>MAX_BUY){
            System.out.println("购买失败，手机一次最多购买"+MAX_BUY+"个");
            return -2;
        }
        //TODO 用super调用父类方法，区别于子类覆盖的重名方法，避免死循环
        return super.buy(count);
    }

    //TODO 同理!!用super调用父类的方法
    public void describe(){
        System.out.println("此手机的商品属性如下");
        super.describe();
        System.out.println("手机厂商为"+brand+"；系统为"+os+"；屏幕为"+screenSize);
    }

    //TODO 给子类创建无参构造函数时报错，
    // 因为该函数会默认调用父类的无参构造函数
    // 如果父类没有无参构造函数，则此处报错
    public Phone(){
        //TODO 子类会默认调用父类的无参构造函数【super();】
        // 如果没有，则要手动创建，或者调用父类的有参构造函数super(name,id,count,soldPrice,purchasePrice);
    }
}
